package Learn_135;

public abstract class learn {
    //抽象方法 作用子类有共性但不完全一样（在父类不能确定具体的方法体）的方法抽取到父类用abstract的方法来封装
    //抽象方法在子类中必须重写 不然报错
    ///抽象方法所在的类必须为抽象类

    public abstract void major();

    //注意事项：
    //抽象类不能实例化
    //有抽象方法的类一定是抽象类 抽象类里不一定有抽象方法
    //子类一定要重写抽象方法 除非子类是抽象类可以不用重写 但是还是不能实例化对象



    //接口
    //父类衍生的子类中如果不是全部都有父类共性的，这时用到接口（可以理解为规则，对行为的抽象）

    //定义使用
    //接口用关键字interface 定义 ：public interface 接口名{}
    //接口不能实例化   接口和类是实现关系 通过implements关键字表示：public class Students implements 接口名{}
    //接口的子类 重写接口的抽象方法 或者本身是抽象类

    //类可以多实现接口 ：public class Students implements 接口名1，接口名2{}
    //继承时也可以多实现public class Students extends Person implements 接口名1，接口名2{}


    //接口中成员的特点
    //成员变量只能是常量 默认修饰符 public static final

    //构造方法 没有
    //成员方法  public abstract 默认修饰符  只能是抽象方法 （jdk7以前只能是抽象方法）
    //jdk8以后可以定义有方法体的方法 默认、静态
    //Jdk9以后就可以写private的方法
    ///jdk8以后接口新增方法允许在接口中定义默认升级方法 需要用关键字default修饰 用来解决接口升级问题

    //默认方法定义格式
//    public default void show(){};

    //默认方法不强制重写 如果要重写去掉default关键字
    ///如果实现多个接口 每个接口都有同名的default方法 那么方法必须重写

    //静态方法不能重写 静态方法只能用接口名字调用  public static void show(){};

    //私有方法有两种 一种是普通的私有方法 另外一种是静态的私有方法  解决重复代码抽取（不想让外界使用）
    //普通的私有方法格式为private void show(){}; 用来服务默认方法          —— 都不加default
    //静态的私有方法格式为 private static void show(){}; 用来服务静态方法    /

    //类和类之间的关系 继承关系只能单继承
    //类和接口之间关系 实现关系 可以单实现 也可以多实现（如果两个接口有重名的 写一个就能实现两个的重写）
    //接口和接口之间的关系 继承关系 可以单继承也可以多继承
    //如果实现类中implements 子接口 那么它的所有父接口的abstract方法都要重写


    //接口的应用
    //行为的抽象 类实现对应的接口
    //接口多态：参数是接口时，可以传所有的接口的实现类  接口类型j=new 实现类对象();

    //适配器设计模式
    //如果有一个接口要写的类1里只用到其中一种方法 而不用其他方法 重写太麻烦
    //就创建一个新的类2（中间类）（抽象修饰中间类 不让外界创建对象（无意义））实现接口然后重写所有方法（空实现）
    //再让类1继承类2 用哪个方法就重写那个方法即可  这里抽象类里的普通方法不用重写 强制重写的是抽象类里的抽象方法

}
